package cn.wolfcode.luowowo.redis.impl;

import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.redis.IStrategyRedisVO;
import cn.wolfcode.luowowo.redis.util.RedisKeys;
import cn.wolfcode.luowowo.redis.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.service.IStrategyService;
import cn.wolfcode.luowowo.util.DateUtil;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
public class StrategyRedisVOImpl implements IStrategyRedisVO {
    /**
     *  增加viewnum的数量
     * @param id
     */
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IStrategyService strategyService;

    /**
     * 增加点赞
     * @param id
     * @return
     */
    @Override
    public StrategyStatisVO addViewnum(String id) {
        //先获取到vo的值
        StrategyStatisVO vo = this.getVO(id);
        //设置阅读数加一
        vo.setViewnum(vo.getViewnum() + 1);
        //设置完之后  在存入redis中(更新redis数据)
        setVoToRedis(vo);
        return vo;
    }

    @Override
    public StrategyStatisVO addReplynum(String strategyId) {
        //先获取到vo的值
        StrategyStatisVO vo = this.getVO(strategyId);
        //设置阅读数加一
        vo.setReplynum(vo.getReplynum() + 1);
        //设置完之后  在存入redis中(更新redis数据)
        setVoToRedis(vo);
        return vo;
    }

    /**
     *   true  收藏
     *   false 取消收藏
     * @param sid 攻略id
     * @return
     */
    @Override
    public boolean addFavornum(String sid,String uid) {
        //先获取vo
        StrategyStatisVO vo = getVO(sid);
        String key = RedisKeys.USER_STRATEGY_FAVOR.join(uid);
        List list = null;
        //判断这个收藏者之前有没有收藏攻略  没有的话就给他一个新的list存sid
        if (!redisTemplate.hasKey(key)){
            list = new ArrayList();
        }else{
            String strategyList = redisTemplate.opsForValue().get(key);
            list= JSON.parseArray(strategyList, String.class);
        }
        //如果集合中之前有收藏这个攻略的话 那这个操作就是取消收藏的操作
        if (list.contains(sid)){
            //vo的收藏数减一
            vo.setFavornum(vo.getFavornum() - 1);
            //sid的list移除
            list.remove(sid);
        }else{//如果之前没有这个攻略id  那么就是收藏操作
            vo.setFavornum(vo.getFavornum() + 1);
            list.add(sid);
        }
        //最后更新redis中收藏者收藏的sid数据和vo数据
        redisTemplate.opsForValue().set(key, JSON.toJSONString(list));
        this.setVoToRedis(vo);
        return list.contains(sid);
    }

    /**
     *  更新redis里的vo
     * @param vo
     */
    public void setVoToRedis(StrategyStatisVO vo) {
        String key = RedisKeys.STRATEGY_STATIS_VO.join(vo.getStrategyId());
        redisTemplate.opsForValue().set(key, JSON.toJSONString(vo));
    }

    /**
     *  获取vo
     * @param id 攻略id
     * @return
     */
    public StrategyStatisVO getVO(String id) {
        String key = RedisKeys.STRATEGY_STATIS_VO.join(id);
        StrategyStatisVO vo = new StrategyStatisVO();
        vo.setStrategyId(id);
        //首先判断key是否在redis中
        //如果不存在的话
        if (!redisTemplate.hasKey(key)){
            Strategy strategy = strategyService.get(id);
            BeanUtils.copyProperties(strategy,vo);
            //设置进redis
            redisTemplate.opsForValue().set(key, JSON.toJSONString(vo));
        }else{//如果已经存在的话
            String voStr = redisTemplate.opsForValue().get(key);
            vo = JSON.parseObject(voStr, StrategyStatisVO.class);
        }
        return vo;
    }

    /**
     *  攻略的顶+1  false 顶过了
     *              true  今天可以顶
     * @param sid 攻略id
     * @param uid 用户id
     * @return
     */
    @Override
    public boolean addThumbup(String sid,String uid) {
        //先生成标记  今天是否已经点赞过的标记
        String key = RedisKeys.USER_STRATEGY_THUMBUP.join(sid,uid);
        //判断今天是否点过赞
        //如果有值的话  说明今天已经点过这篇攻略的赞了
        if (redisTemplate.hasKey(key)){
            return false;
        }else{//没有值的话  就是今天还没有点过这个攻略的赞
            //点赞的时刻
            Date now = new Date();
            //今天最后一秒的时刻
            Date endDate = DateUtil.getEndDate(now);
            //点赞时刻到今天结束时刻  中间剩余多少时间
            long dateBetween = DateUtil.getDateBetween(now, endDate);
            //保存时间是今天剩余的时间
            redisTemplate.opsForValue().set(key,"1",dateBetween, TimeUnit.SECONDS);
            StrategyStatisVO vo = getVO(sid);
            vo.setThumbsupnum(vo.getThumbsupnum() + 1);
            setVoToRedis(vo);
            return true;
        }
    }

    @Override
    public List<StrategyStatisVO> searchRedisVo() {
        //查出以strategy_statis_vo:*  开头的所有的key
        String pattern = RedisKeys.STRATEGY_STATIS_VO.join("*");
        Set<String> keys = redisTemplate.keys(pattern);
        List<StrategyStatisVO> list = new ArrayList();
        //遍历出所有的key  查出vo
        for (String key : keys) {
            String voStr = redisTemplate.opsForValue().get(key);
            //转化成vo对象
            StrategyStatisVO vo = JSON.parseObject(voStr, StrategyStatisVO.class);
            list.add(vo);
        }
        return list;
    }
}
